package com.线程Thread.Exercise;

import java.util.Random;
import java.util.Scanner;
@SuppressWarnings("all")
public class Exercise02  {
    /**
     *main线程开两个子线程，
     * a线程一直输出0~100之间的随机数，直到另一线程b输入Q退出；
     * 1.守护线程
     * 2.线程通知方式控制
     */
    public static void main(String[] args) {

        MyThread1 m1 = new MyThread1();  ///创建两个线程类对象；
        MyThread2 m2 = new MyThread2(m1);  ///m1给到m2，方便通知下线；
        /// 创建两个线程对象，并将任务实例传递给线程
        Thread t1 = new Thread(m1);  /// 使用m1和m2作为任务创建线程对象t1,t2
        Thread t2 = new Thread(m2);

//        t1.setDaemon(true);  ///将t1线程设置成守护线程，当关闭t2线程时会自动关闭；
        t1.start();
        t2.start();
    }


}
/// 该线程会一直输出0~100之间的随机数，直到另一线程输入Q退出；
class MyThread1 implements Runnable {
    Random r = new Random();
    private  boolean loop = true;

    public void setLoop(boolean loop) {
        this.loop = loop;
    }

    @Override
    public void run() {
        while (loop) {
            System.out.println(r.nextInt(100));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
/// 该线程推出==退出，另一守护线程就退出了；
class MyThread2 implements Runnable {
    Scanner sc = new Scanner(System.in);
    MyThread1 m1;  ///用来控制m1的loop
    public MyThread2(MyThread1 m1) {
        this.m1 = m1;
    }

    @Override
    public void run() {
        while (true) {
            if(sc.next().toUpperCase().charAt(0) == 'Q') {/// 转成大写；
                m1.setLoop(false);  ///线程通知方式改变 while (loop)
                return;
            }
        }
    }
}